package com.domus.dreamMenu.servidor.bancodados;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Iterator;

import com.domus.dreamMenu.servidor.tipos.EntradaPedido;
import com.domus.dreamMenu.servidor.tipos.Pedido;

public class ConexaoBancoDadosPedido extends ConexaoBancoDados {
	
	public void inserirPedido(Pedido novo){
		try{
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("BEGIN;");
			comando.execute();
			
			comando = ConexaoBancoDados.conexao.prepareStatement("INSERT INTO pedido " + 
					"VALUES (NEXTVAL('pedido_codigo_pedido_seq'), current_timestamp, ?, ?)"); 
			comando.setInt(1, novo.getConta());
			comando.setInt(2, novo.getMatriculaGarcom());
			
			comando.executeUpdate();
			
			Iterator<EntradaPedido> iterator = novo.getEntradas();
			EntradaPedido entrada;
			comando = ConexaoBancoDados.conexao.prepareStatement("INSERT INTO pedido_prato VALUES " +
					"(CURRVAL('pedido_codigo_pedido_seq'),?, ?)");
			while(iterator.hasNext()){
				entrada = iterator.next();
				comando.setInt(1, entrada.getCodigoPrato());
				comando.setInt(2, entrada.getQuantidade());
				
				comando.executeUpdate();
			}
			
			comando = ConexaoBancoDados.conexao.prepareStatement("END;");
			comando.execute();
			
			ConexaoBancoDados.conexao.commit();
				
		}catch (SQLException e){
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	public void atualizarPedido(int codigo, Pedido novo){
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("BEGIN;");
			comando.execute();
			
			comando = ConexaoBancoDados.conexao.prepareStatement("UPDATE pedido SET matricula_garcom = ? " +
					"WHERE codigo_pedido = ?");
			comando.setInt(1, novo.getMatriculaGarcom());
			comando.setInt(2, codigo);
			
			comando.executeUpdate();
			
			comando = ConexaoBancoDados.conexao.prepareStatement("DELETE FROM pedido_prato WHERE " +
					"codigo_pedido = ?");
			comando.setInt(1, codigo);
			
			comando.executeUpdate();
			
			Iterator<EntradaPedido> iterator = novo.getEntradas();
			EntradaPedido entrada;
			comando = ConexaoBancoDados.conexao.prepareStatement("INSERT INTO pedido_prato VALUES " +
					"(?, ?, ?)");
			while(iterator.hasNext()){
				entrada = iterator.next();
				comando.setInt(1, codigo);
				comando.setInt(2, entrada.getCodigoPrato());
				comando.setInt(3, entrada.getQuantidade());
				
				comando.executeUpdate();
			}
			
			comando = ConexaoBancoDados.conexao.prepareStatement("END;");
			comando.execute();
			
			ConexaoBancoDados.conexao.commit();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void removerPedido(int codigo){
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("DELETE FROM pedido " +
					"WHERE codigo_pedido = ?");
			comando.setInt(1, codigo);
			
			comando.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public ArrayList<Pedido> getPedidos(int conta) {
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("SELECT codigo_pedido," +
					"data_hora, matricula_garcom FROM pedido WHERE codigo_conta = ?");
			comando.setInt(1, conta);
			
			ArrayList<Pedido> pedidos = new ArrayList<Pedido>();
			ResultSet resultSetConta = comando.executeQuery();

			while(resultSetConta.next()){
				int codigoPedido = resultSetConta.getInt(1);
				Timestamp dataHora = resultSetConta.getTimestamp(2);
				int matricula = resultSetConta.getInt(3);
				
				comando = ConexaoBancoDados.conexao.prepareStatement("SELECT codigo_prato, quantidade " +
						"FROM pedido_prato WHERE codigo_pedido = ?");
				comando.setInt(1, codigoPedido);
				
				ArrayList<EntradaPedido> entradas = new ArrayList<EntradaPedido>(); 
				ResultSet resultSetPedido = comando.executeQuery();
				
				while(resultSetPedido.next()){
					int prato = resultSetPedido.getInt(1);
					int quantidade = resultSetPedido.getInt(2);
					
					entradas.add(new EntradaPedido(prato, quantidade));
				}
				
				pedidos.add(new Pedido(codigoPedido, dataHora, entradas, matricula, conta));
			}
			
			return pedidos;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	public void criarConta(int mesa) {
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("INSERT INTO conta " +
					"VALUES (NEXTVAL('conta_codigo_seq'), current_timestamp, NULL, ?)");
			comando.setInt(1, mesa);
			
			comando.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public ArrayList<Pedido> fecharConta(int mesa) {
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("BEGIN;");
			comando.execute();
			
			comando = ConexaoBancoDados.conexao.prepareStatement("SELECT codigo FROM conta WHERE " +
					"fechamento IS NOT NULL AND numero_mesa = ?");
			comando.setInt(1, mesa);
			ResultSet resultSetConta = comando.executeQuery();
			
			resultSetConta.next();
			int conta = resultSetConta.getInt(1);
			
			ArrayList<Pedido> pedidos = this.getPedidos(conta);
			
			comando = ConexaoBancoDados.conexao.prepareStatement("UPDATE conta SET fechamento = " +
					"current_timestamp WHERE fechamento IS NULL AND numero_mesa = ?");
			comando.setInt(1, mesa);			
			comando.executeUpdate();
			
			comando.execute("END;");
			
			return pedidos; 
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return null;
	}

	public void atualizarConta(int mesaAtual, int novaMesa) {
		try {
			PreparedStatement comando = ConexaoBancoDados.conexao.prepareStatement("UPDATE conta SET " +
					"numero_mesa = ? WHERE fechamento IS NULL AND numero_mesa = ?");
			comando.setInt(1, novaMesa);
			comando.setInt(2, mesaAtual);
			
			comando.executeUpdate();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}
